SciChart WPF 2D Charts > DataSeries API > UniformXyDataSeries – fast and memory-efficient
UniformXyDataSeries – fast and memory-efficient

UniformXyDataSeries is a DataSeries type in SciChart that doesn’t require X-Values. Instead, X positions are calculated based on XStart and XStep properties. This gives UniformXyDataSeries an advantage over other DataSeries types in terms of allocated memory and data processing speed. From usage perspective, UniformXyDataSeries is beneficial when X values are equidistant.

Creation

There are various ways to create UniformXyDataSeries:

Creating UniformXyDataSeries
Copy Code
// Create a UniformXyDataSeries and initialize it with XStart, XStep
var uniformDataSeries = new UniformXyDataSeries<double>()
{
     XStart = -100,
     XStep = 1.5
};
// Create a UniformXyDataSeries and initialize it with array of YValues
var yValues = new double[] { -21, 3.6, -10, 13.3};
uniformDataSeries = new UniformXyDataSeries<double>(yValues);

To achieve the most optimal performance, additional info about data can be provided in constructors as DataDistributionParams. There are two options possible: foreknowledge of data peaks (if data contains frequent, repetitive peaks) or whether NaN values are expected:

DataDistributionParams constructor
Copy Code
// Create DataDistributionArgs which declare that NaN values are expected and frequent data peaks are 0 and 1
var dataDistributionArgs = new UniformDataDistributionArgs<double>(true, 0, 1);
// Create a UniformXyDataSeries with initial Capacity and DataDistributionArgs
var uniformDataSeries = new UniformXyDataSeries<double>(1_000_000, dataDistributionArgs);

Providing DataDistributionParams can have huge impact on performance, so DataDistributionParams should be used whenever possible.

PointMetadata

It is possible to provide a list of PointMetadata for every data point in UniformXyDataSeries. PointMetadata can be used to change rendering of certain data points via PaletteProviders, to show additional info in Tooltips, etc.

PointMetadata
Copy Code
// Create a UniformXyDataSeries and initialize it with array of YValues and PointMetadata
yValues = new double[] { -21, 3.6, -10, 13.3 };
var metadata = new IPointMetadata[yValues.Length];
var uniformDataSeries = new UniformXyDataSeries<double>(yValues, metadata);

Updating

UniformXyDataSeries API provides a bunch of methods that can be used to append or insert new data, update or remove some data points in existing data set:

Editing data points in existing data set
Copy Code
// Append a collection of Y-Values to the existing data set
uniformDataSeries.Append(yValuesCollection);
// Update Y-Value at given index
uniformDataSeries.Update(15, 145d);
// Remove range of N elements starting at given index
uniformDataSeries.RemoveRange(0, 10);
// Reset UniformXyDataSeries to a new Y-Values collection
uniformDataSeries.Reset(yValuesCollection);
// Clear Y-Values
uniformDataSeries.Clear();

Such operations, when occur, trigger DataSeriesChanged event. It can be used to listen to data changes and receive more detailed information about the changes.

FIFO Mode

It is possible to fill UniformXyDataSeries in FIFO manner. Setting FifoCapacity on UniformXyDataSeries enables this mode. When in FIFO mode, old data points are removed from the beginning of the data set when new ones are added:

Creating UniformXyDataSeries
Copy Code
// Create a UniformXyDataSeries as FIFO (circular) buffer.
// Initialize it with XStart, XStep and FIFO capacity
var uniformDataSeries = new UniformXyDataSeries<double>()
{
     XStart = -100,
     XStep = 1.5
     FifoCapacity = 5000
};

Data Filters

It is possible to filter data in UniformXyDataSeries and create a new UniformXyDataSeries with filtered results. It can be done using Data Filters API. Supported filters allows Scaling, Offsetting, finding Simple Moving Average series, Linear and Polynomial Trendlines and creating Splines:

using Data Filters API
Copy Code
// Scales every data point by ScaleFactor and returns new UniformXyDataSeries
var scaledDataSeries = uniformDataSeries.Scale(1.5);
// Offsets every data point by Offset and returns new UniformXyDataSeries
var offsetDataSeries = uniformDataSeries.Offset(15);
// Returns a new UniformXyDataSeries containing simple MovingAverage of N points
var movingAverage = uniformDataSeries.ToMovingAverage(50);
var offsetDataSeries = uniformDataSeries.Offset(15);

Limitations

There are certain limitations that apply to usage of UniformXyDataSeries:

  • XStart and XStep properties accept Double values only
  • UniformXyDataSeries cannot be used with FastMountainRenderableSeries and StackedMountainRenderableSeries
  • Only NumericAxis types can render UniformXyDataSeries, except LogarithmicNumericAxis and NegativeLogarithmicNumericAxis
  • CategoryNumericAxis doesn’t support UniformXyDataSeries in FIFO mode